package models;

import java.io.File;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import controllers.Secure.Security;

import models.dados.ChaveRepetidaException;
import models.dados.DadoNaoEncontradoException;

public class ServicosAdministracao implements InterfaceAdministracao {

	private static ServicosAdministracao unicaInstancia;
	private static LoginAdministrador loginAdministrador;
	private PesquisaUsuario pesquisaUsuario;
	private static GerenciaAdministradores gerenciaAdministradores;
	private static GerenciaPedidos gerenciaPedidos;
	private static GerenciaClientes gerenciaClientes;
	private static GerenciaProdutos gerenciaProdutos;
	private static CadastroDonut cadastroDonut;

	private ServicosAdministracao() {
		pesquisaUsuario = new PesquisaUsuario();
		loginAdministrador = new LoginAdministrador();
		gerenciaAdministradores = new GerenciaAdministradores();
		gerenciaPedidos = new GerenciaPedidos();
		gerenciaClientes = new GerenciaClientes();
		cadastroDonut = new CadastroDonut();
		gerenciaProdutos = new GerenciaProdutos();
		

	}

	public static InterfaceAdministracao getInstancia() {
		if (unicaInstancia == null) {
			unicaInstancia = new ServicosAdministracao();
			return unicaInstancia;
		} else {
			return unicaInstancia;
		}
	}

	@Override
	public boolean loginAdministrador(String nomeUsuario, String senha)
			throws UsuarioBloqueadoException, DadoNaoEncontradoException, SQLException {
		return loginAdministrador.login(nomeUsuario, senha);

	}

	@Override
	public void logout() {
		// talvez nunca será implementado

	}



	@Override
	public void cadastrarAdministrador(String nomeUsuario, String senha,
			TipoUsuario tipoUsuario,String cadastradoPor) throws DadoNaoEncontradoException, AcessoNegadoException, ChaveRepetidaException, SQLException {
		Administrador adm = new Administrador(nomeUsuario, senha, true,false, 5, tipoUsuario, cadastradoPor);
		this.gerenciaAdministradores.cadastrarAdministrador(adm,cadastradoPor);

	}
	
	


	
	@Override
	public void cadastrarDonut(String nomeProduto, String sabor, double preco,
			String arquivoImagem, Date dataCadastro, String cadastradoPor)
			throws ChaveRepetidaException, AcessoNegadoException, SQLException {
		this.cadastroDonut.cadastrar(sabor, preco, arquivoImagem, cadastradoPor);
		
	}

	@Override
	public List<Administrador> listarAdministradores(String usuarioAlt,String usuario,TipoUsuario tipo,String cadastradoPor,GregorianCalendar dataCadastro,boolean bloqueado,
			boolean naoBloqueado,boolean ativo,boolean inativo) {
		return this.gerenciaAdministradores.listarAdministradores(usuario, tipo, cadastradoPor, dataCadastro, bloqueado,naoBloqueado,ativo,inativo);
	}

	@Override
	public void removerAdministrador(String nomeUsuario, String alteradoPor) throws DadoNaoEncontradoException, SQLException {
		this.gerenciaAdministradores.removerAdministrador(nomeUsuario, alteradoPor);

	}

	@Override
	public void alterarAdministrador(Administrador administrador,String alteradoPor) {
		gerenciaAdministradores.alterarAdministrador(administrador, alteradoPor);

	}





	@Override
	public List<Cliente> listarClientes(String nomeUsuario,String nome,Calendar dataCadastro,Calendar dataCadastroInicial,Calendar dataCadastroFinal,boolean bloqueado,boolean naoBloqueado,boolean ehCadastrado,boolean naoCadastrado,String usuarioAlteracao) throws DadoNaoEncontradoException, SQLException{
		return this.gerenciaClientes.listarClientes(nomeUsuario, nome, dataCadastro, dataCadastroInicial, dataCadastroFinal, bloqueado,naoBloqueado, ehCadastrado,naoCadastrado, usuarioAlteracao);
	}



	
	@Override
	public List<Produto> listarProdutos(String tipo) throws SQLException{
		return this.gerenciaProdutos.listarDonuts();
	}

	@Override
	public void removerPedido(long numero,String removidoPor) throws DadoNaoEncontradoException {
		this.gerenciaPedidos.removerPedido(numero, removidoPor);

	}



	@Override
	public void ativarCliente(String nomeUsuario, boolean ativo,String ativadoPor) {
		// TODO Auto-generated method stub

	}

	@Override
	public void removerCliente(String usuarioCliente,String removidoPor) throws DadoNaoEncontradoException, SQLException {
		this.gerenciaClientes.RemoverCliente(usuarioCliente, removidoPor);

	}

	@Override
	public Usuario pesquisarUsuario(String nomeUsuario)
			throws DadoNaoEncontradoException, SQLException {
		return pesquisaUsuario.getUsuario(nomeUsuario);
	}

	@Override
	public Cliente pesquisarCliente(String nomeUsuario)
			throws DadoNaoEncontradoException {
		return pesquisaUsuario.getCliente(nomeUsuario);
	}

	@Override
	public Administrador pesquisarAdministrador(String usuario)
			throws DadoNaoEncontradoException, SQLException {
		return pesquisaUsuario.getAdministrador(usuario);
	}

	@Override
	public void removerProduto(String tipo, String marca, String nome,String removidoPor) throws DadoNaoEncontradoException {
		this.gerenciaProdutos.removerProduto(tipo, marca, nome);
		
	}

	@Override
	public Pedido getPedido(long numero,String usuarioAdministrador) throws DadoNaoEncontradoException {
		return this.gerenciaPedidos.getPedido(numero,usuarioAdministrador);
	}

	@Override
	public void alterarStatusPedido(long numero,String novoStatus, String nomeUsuarioAlteracao) throws DadoNaoEncontradoException, AcessoNegadoException {
		
		this.gerenciaPedidos.alterarPedido(numero, novoStatus, nomeUsuarioAlteracao);
		
	}

	@Override
	public void ativarAdministrador(String usuario, boolean ativar,
			String ativadoPor) throws DadoNaoEncontradoException, SQLException {
		this.gerenciaAdministradores.ativarAdministrador(usuario,ativar,ativadoPor);
		
	}
	
	@Override
	public List<Pedido> listarPedidos(long numero,String usuarioCliente,String nome,GregorianCalendar DataExata,GregorianCalendar dataInicial,
			GregorianCalendar dataFinal,String status,String usuarioUltimaAlteracao,GregorianCalendar dataUltimaAteracao,String usuarioAltercao) {
		return this.gerenciaPedidos.listar(numero, usuarioCliente, nome, DataExata, dataInicial, dataFinal, status, usuarioUltimaAlteracao, dataUltimaAteracao,usuarioAltercao);
	}

	@Override
	public Produto getProduto(String tipo, String marca, String nome) {
		return this.gerenciaProdutos.getProduto(tipo, marca, nome);
	}

	@Override
	public void alterarProduto(String nome,String novoNome,double preco,File imagem, String usuarioAlteracao) throws DadoNaoEncontradoException {
		this.gerenciaProdutos.alterarProduto(nome, novoNome, preco, imagem, usuarioAlteracao);
		
	}





}
